package com.dxt;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

/**
 * 函数式接口
 * 1、概述
 *   只有一个抽象方法的接口我们称之为函数接口
 *   JDK的函数式接口都加上了 @FunctionalInterface 注解进行标识。但是无论是否加上该注解，只要接口中只有一个抽象方法，
 * 都是函数式接口。
 * 2、常见的函数式接口
 * （1）Consumer 消费接口
 * （2）Function 计算转换接口
 * （3）Predicate 判断接口
 * （4）Supplier 生产型接口
 * 3、常用的默认方法
 * （1）and()
 * （2）or()
 * （3）negate()
 *  ...
 */
public class InterfaceDemo {

    public static void main(String[] args) {
        test01();
    }

    /**
     * 测试常见的函数式接口方法
     */
    public static void test01(){
        List<Author> authors = getAuthors();

        //and()
        // 打印年龄小于30 并且 姓名长度大于1的作者
        authors.stream()
                .filter(((Predicate<Author>) author -> author.getAge() < 30)
                        .and(author -> author.getName().length() > 1))
                .forEach(author -> System.out.println(author));

        System.out.println();

        //or()
        // 打印年龄小于30 或者 姓名长度大于1的作者
        authors.stream()
                .filter(((Predicate<Author>) author -> author.getAge() < 30)
                        .or(author -> author.getName().length() > 1))
                .forEach(author -> System.out.println(author));
        System.out.println();

        //negate()
        // 打印年龄不小于30
        authors.stream()
                .filter(((Predicate<Author>) author -> author.getAge() < 30).negate())
                .forEach(author -> System.out.println(author));
    }

    private static List<Author> getAuthors(){
        //数据初始化
        Author author1 = new Author(1L, "蒙多", 33, "一个从菜刀中明悟哲理的祖安人", null);
        Author author2 = new Author(2L, "亚拉索", 15, "狂风也追不上他的思想", null);
        Author author3 = new Author(3L, "易", 14, "是这个世界在限制他的思维", null);
        Author author4 = new Author(3L, "易", 14, "是这个世界在限制他的思维", null);

        //书籍列表
        List<Book> books1 = new ArrayList<Book>();
        List<Book> books2 = new ArrayList<Book>();
        List<Book> books3 = new ArrayList<Book>();

        books1.add(new Book(1L, "Java", "程序设计语言,计算机", 88, "java语言基础"));
        books1.add(new Book(2L, "c++", "底层程序设计语言,计算机", 80, "c++语言基础"));

        books2.add(new Book(3L, "go", "程序设计语言,高并发", 70, "go语言基础"));
        books2.add(new Book(3L, "go", "程序设计语言,高并发", 70, "go语言基础"));
        books2.add(new Book(4L, "分布式系统设计", "系统开发,应用", 80, "项目实战"));

        books3.add(new Book(5L, "redis", "缓存，中间件", 86, "技术应用"));
        books3.add(new Book(6L, "springboot", "框架", 90, "项目开发"));
        books3.add(new Book(6L, "springboot", "框架", 90, "项目开发"));

        author1.setBooks(books1);
        author2.setBooks(books2);
        author3.setBooks(books3);
        author4.setBooks(books3);

        List<Author> authors = new ArrayList<Author>(Arrays.asList(author1, author2, author3, author4));

        return authors;

    }

}
